package com.yuxl.admin.manager.auth.socket.handler;

import com.yuxl.admin.common.socket.annotation.SocketHandle;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class SocketHandlerRegistry implements BeanPostProcessor {
    // 创建日志记录器
    // 存储路径到处理方法的映射
    private final Map<String, Method> handlers = new HashMap<>();
    // 存储路径到Bean实例的映射
    private final Map<String, Object> beans = new HashMap<>();

    /**
     * 在Bean初始化后处理，用于注册带有@SocketHandle注解的方法
     * @param bean 被处理的Bean
     * @param beanName Bean的名称
     * @return 处理后的Bean
     */
    @Override
    public Object postProcessAfterInitialization(Object bean,@NonNull String beanName) {
        Class<?> clazz = bean.getClass();
        // 遍历类中的所有方法
        for (Method method : clazz.getDeclaredMethods()) {
            SocketHandle annotation = method.getAnnotation(SocketHandle.class);
            // 如果方法带有@SocketHandle注解
            if (annotation != null) {
                String path = annotation.path();
                handlers.put(path, method);
                beans.put(path, bean);
                log.debug("注册了路径 {} 的处理器，在类: {}", path, clazz.getSimpleName());
            }
        }
        return bean;
    }

    /**
     * 获取指定路径的处理方法
     * @param path WebSocket消息路径
     * @return 对应的处理方法，如果不存在则返回null
     */
    public Method getHandler(String path) {
        Method handler = handlers.get(path);
        if (handler == null) {
            log.warn("未找到路径 {} 的处理器", path);
        }
        return handler;
    }

    /**
     * 获取指定路径的Bean实例
     * @param path WebSocket消息路径
     * @return 对应的Bean实例，如果不存在则返回null
     */
    public Object getBean(String path) {
        Object bean = beans.get(path);
        if (bean == null) {
            log.warn("未找到路径 {} 的Bean", path);
        }
        return bean;
    }
}